/*
 * PDD.h
 *
 *  Created on: 22/09/2011
 *      Author: utn_so
 */

#ifndef PDD_H_
#define PDD_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
#include "logs/LogFile.h"
#include "lib1.h"

#include "lib/conexionPPD.h"
//#include "lib/operacionesPPD.h"
//#include "lib/mapping.h"

#include "consolaPDD/Socket_Servidor.h"
#include "consolaPDD/consolaPDD.h"

#define FILEPATH "/home/utn_so/Escritorio/fat32.disk" /*Path de directorio de disco se va a tomar por config*/
#define SOCK_PATH "/home/utn_so/Desarrollo/Workspace/socket_UNIX"
#define BLOQUE  (512) /*BYTES*/
#define FILESIZE (BLOQUE * sizeof(int))
#define SIZEPAYLOAD 1024

#define CONNECT 1
#define LISTEN 2

#define CSCAN 1
#define FSCAN 2

#define HANDSHAKE 0
#define LECTURA 1
#define ESCRITURA 2
#define CONSOLAPDD 3

#define ASCENDENTE 1
#define DESCENDENTE 2

extern uint16_t remote;

typedef struct {
	int nroSector;
	char *data;
} t_elemCache;

typedef struct {
	char antencion;
	int sentido;
	int sectorAnterior;
	t_list *pendientes;
} t_listaAtencion;

typedef struct {
	int cilindro;
	int cabeza;
	int sector;
} t_chs;

typedef struct {
	int modoInicio;
	int algoritmoPlanificacion;
	int flagLogs;
	int idDisco;
	int cabezas;
	int cilindros;
	int sectores;

	char *myIp;
	char *ipDispo;

	int puertoRecv;
	int puertoSend;
	int puertoDispRecv;
	int puertoDispSend;
	int puertoPFSPoll;

	t_chs chsConfig;
	double tiempoLectura;
	double tiempoEscritura;
	int RPM;
	double tiempoSaltoPistas;
	t_log *log;
	uint32_t tamPoll;
	uint32_t tamCache;
	int lvlLog;
}t_config;

typedef struct {
	t_chs * chsActual;
	t_config * configArch;
}t_pdd;

typedef struct {
	int tOperacion;
	short length;
	int nSector;
	int offset;
	char* info;
} t_peticion;

typedef struct {
	t_peticion *peticionResuelta;
	t_socket_client *client;
} t_peticionResuelta;
/******************************General************************************/
/*************************************************************************/


t_socket_client *getSocketDispositivo();
void setSocketDispositivo(t_socket_client *client);
void* conexion_consola();
void setCHSActual(t_chs* chs);
t_config* getConfig();
t_chs * getCHSActual();
void setConfig(t_config *config);
t_peticion *inicializaPeticion(int nSector);
t_list *getListPeticiones(int algoritmo);
t_list *getListCargaPeticiones(int algoritmo, int sentido);
void setListPeticiones();
t_list *getListPeticionesResueltas();
void setListPeticionesResueltas();
t_listaAtencion *listaAEscucha();
t_listaAtencion *listaAtencion();
void *listaEnEscucha(t_listaAtencion *elem);
void *listaEnAtencion(t_listaAtencion *elem);
t_listaAtencion *listaAscendente();
t_listaAtencion *listaDescendente();
void *listaEnAscenso(t_listaAtencion *elem);
void *listaEnDescenso(t_listaAtencion *elem);
void destroyPeticion(t_peticion *peticion);
char* getDescripcionDeError(uint32_t error);
t_peticionResuelta *getPeticionResueltaByClient(t_socket_client *client);

#endif /* PDD_H_ */
